﻿using System;
using System.Collections.Generic;
using GSQ.BusinessEntities;
using GSQ.DataAccess;

namespace GSQ.BusinessLogic
{
    public class OriginalesBL
    {
        public void Insert(ORIGINALES value)
        {
            if (value.IsValid())
            {
                ORIGINALES original = new OriginalesDA().GetByNroOriginal(value.NRO_ORIGINAL);
                ORIGINALES_ADICIONALES originalAdicional = new OriginalesAdicionalesDA().GetByNroAdicional(value.NRO_ORIGINAL);
                if (original != null || originalAdicional != null)
                {
                    throw new InvalidOperationException("Nro. Original ya está registrado como un ORIGINAL o ORIGINAL ADICIONAL. Revise por favor.");
                }

                if (value.DEPARTAMENTOS == null || new DepartamentosDA().GetById(value.DEPARTAMENTOS.ID) == null)
                {
                    throw new InvalidOperationException("ID departamento no existe. Revise por favor.");
                }

                value.ID = new OriginalesDA().Insert(value);
            }
            else
                throw new ArgumentException("La entidad no esta valida");
        }

        public void Update(ORIGINALES newValue, ORIGINALES oldValue)
        {
            if (newValue.IsValid())
            {
                if (newValue.DEPARTAMENTOS.ID != oldValue.DEPARTAMENTOS.ID)
                    if (newValue.DEPARTAMENTOS != null)
                        if (new DepartamentosDA().GetById(newValue.DEPARTAMENTOS.ID) == null)
                        {
                            throw new InvalidOperationException("ID departamento no existe. Revise por favor.");
                        }
                new OriginalesDA().Update(newValue);
            }
            else
                throw new ArgumentException("La entidad no esta valida");
        }

        public List<ORIGINALES> GetAll()
        {
            return new OriginalesDA().GetAll();
        }

        public ORIGINALES GetById(decimal value)
        {
            return new OriginalesDA().GetById(value);
        }

        public ORIGINALES GetByNroOriginal(string value)
        {
            return new OriginalesDA().GetByNroOriginal(value.Trim());
        }

        public List<ORIGINALES> GetByDescripcion(decimal value)
        {
            return new OriginalesDA().GetByDescripcion(value);
        }

        public List<ORIGINALES> GetByDescripcion(string value)
        {
            return new OriginalesDA().GetByDescripcion(value.Trim());
        }

        public List<ORIGINALES> GetByDepartamento(decimal value)
        {
            return new OriginalesDA().GetByIdDepartamento(value);
        }

        public List<ORIGINALES> GetByDepartamento(string value)
        {
            return new OriginalesDA().GetByDepartamento(value.Trim());
        }

        public List<ORIGINALES> GetByCategoria(decimal value)
        {
            return new OriginalesDA().GetByIdCategoria(value);
        }

        public List<ORIGINALES> GetByCategoria(string value)
        {
            return new OriginalesDA().GetByCategoria(value.Trim());
        }
    }
    public class OriginalesAdicionalesBL
    {
        public void Insert(ORIGINALES_ADICIONALES value)
        {
            if (value.IsValid())
            {
                ORIGINALES_ADICIONALES originalAdicional = new OriginalesAdicionalesDA().GetByNroAdicional(value.NRO_ADICIONAL);
                if (originalAdicional != null)
                {
                    throw new InvalidOperationException("Nro. Adicional ya está registrado!!. Revise por favor.");
                }

                ORIGINALES original = new OriginalesDA().GetById(value.ID_ORIGINAL);

                if (original == null)
                {
                    throw new InvalidOperationException("No existe Nro. Original indicado!!. Revise por favor.");
                }
                value.ID = new OriginalesAdicionalesDA().Insert(value);
            }
            else
                throw new ArgumentException("La entidad no esta valida");
        }

        public void Update(ORIGINALES_ADICIONALES newValue, ORIGINALES_ADICIONALES oldValue)
        {
            if (newValue.IsValid())
            {
                oldValue = new OriginalesAdicionalesDA().GetById(oldValue.ID);
                if (oldValue.NRO_ADICIONAL == oldValue.ORIGINALES.NRO_ORIGINAL && newValue.NRO_ADICIONAL != oldValue.NRO_ADICIONAL)
                    throw new ArgumentException("No se puede modificar este Nro. Adicional porque es un original principal.");
                new OriginalesAdicionalesDA().Update(newValue);
            }
            else
                throw new ArgumentException("La entidad no esta valida");
        }

        public List<ORIGINALES_ADICIONALES> GetAll()
        {
            return new OriginalesAdicionalesDA().GetAll();
        }

        public ORIGINALES_ADICIONALES GetById(decimal value)
        {
            return new OriginalesAdicionalesDA().GetById(value);
        }

        public ORIGINALES_ADICIONALES GetByNroAdicional(string value)
        {
            return new OriginalesAdicionalesDA().GetByNroAdicional(value.Trim());
        }

        public List<ORIGINALES_ADICIONALES> GetByNroOriginal(string value)
        {
            return new OriginalesAdicionalesDA().GetByNroOriginal(value.Trim());
        }

        public List<ORIGINALES_ADICIONALES> GetByDescripcion(decimal value)
        {
            return new OriginalesAdicionalesDA().GetByDescripcion(value);
        }

        public List<ORIGINALES_ADICIONALES> GetByDescripcion(string value)
        {
            return new OriginalesAdicionalesDA().GetByDescripcion(value.Trim());
        }

        public List<ORIGINALES_ADICIONALES> GetByDepartamento(decimal value)
        {
            return new OriginalesAdicionalesDA().GetByIdDepartamento(value);
        }

        public List<ORIGINALES_ADICIONALES> GetByDepartamento(string value)
        {
            return new OriginalesAdicionalesDA().GetByDepartamento(value.Trim());
        }

        public List<ORIGINALES_ADICIONALES> GetByCategoria(decimal value)
        {
            return new OriginalesAdicionalesDA().GetByIdCategoria(value);
        }

        public List<ORIGINALES_ADICIONALES> GetByCategoria(string value)
        {
            return new OriginalesAdicionalesDA().GetByCategoria(value.Trim());
        }
    }
}
